using System;
using System.Collections.Generic;
using System.Text;

using RRHH.Competencias.DataAccessLayer.Generic;
using RRHH.Competencias.DataAccessLayer;
using RRHH.Competencias.Entities;

namespace RRHH.Competencias.Controladores
{
    /// <summary>
    /// Agrupa las operaciones relacionadas con los Puestos
    /// </summary>
    public class GestorPuesto
    {
        private IDALPuesto persistencia;
        
        public GestorPuesto()
        {
            this.persistencia = DALProvider.GetDALPuesto();            
        }

        /// <summary>
        /// Crea un puesto
        /// </summary>
        /// <param name="puesto">Puesto a crear. Se devuelve el ID del puesto creado</param>
        public bool Registrar(Puesto puesto)
        {
            if (puesto == null) throw new Exception("Debe indicar el puesto");

            //TODO: Reglas de negocio

            List<Puesto> lstPuestos= Buscar(null, null, puesto.Nombre, null, false);

            if (lstPuestos.Count == 0)
            {
                persistencia.Guardar(puesto);
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Modifica la informacion disponible de un puesto
        /// </summary>
        /// <param name="puesto">Puesto a eliminar</param>
        public bool Modificar(Puesto puesto)
        {
            bool noExisteNombrePuesto = false;

            if (puesto == null) throw new Exception("Debe indicar el puesto");
            if (puesto.Proceso.Id <= 0) throw new Exception("Debe indicar el ID del colaborador");
            
            //TODO: Reglas de negocio

            //Buscamos si existe un Colaborador con el nombre a actualizar
            List<Puesto> lstPuestos = Buscar(null, null, puesto.Nombre, null, false);

            if (lstPuestos.Count == 0)
            {
                noExisteNombrePuesto =true;
            }
            else
            {
                foreach (Puesto p in lstPuestos)
                {
                    if (p.Id == puesto.Id)
                    {
                        //El nombre existe en la BD pero corresponde al Puesto que vamos a actualizar
                        noExisteNombrePuesto = true;
                    }
                    else
                    {
                        //El nombre existe en la BD en otro Puesto diferente del que vamos a actualizar
                        noExisteNombrePuesto = false;
                    }
                }
            }

            if (noExisteNombrePuesto)
            {
                persistencia.Actualizar(puesto);
            }

            return noExisteNombrePuesto;
        }

        /// <summary>
        /// Elimina un puesto
        /// </summary>
        /// <param name="puesto">Puesto a eliminar. Indicar el ID</param>
        public void Eliminar(Puesto puesto)
        {
            throw new Exception("Metodo no implementado");
        }

        /// <summary>
        /// Activa el puesto de la base 
        /// </summary>
        /// <param name="item"></param>
        public void Activar(Puesto puesto)
        {
            if (puesto == null) throw new Exception("Debe indicar el puesto");
            if (puesto.Proceso.Id <= 0) throw new Exception("Debe indicar el ID del puesto");

            //TODO: Reglas de negocio

            persistencia.Activar(puesto);
        }

        /// <summary>
        /// Borra logicamente el puesto de la base 
        /// </summary>
        /// <param name="item"></param>
        public void Desactivar(Puesto puesto)
        {
            if (puesto == null) throw new Exception("Debe indicar el puesto");
            if (puesto.Proceso.Id <= 0) throw new Exception("Debe indicar el ID del puesto");

            //TODO: Reglas de negocio

            persistencia.Desactivar(puesto);
        }

        /// <summary>
        /// Obtiene los datos de un puesto
        /// </summary>
        /// <param name="puesto">Puesto a completar. Indicar el ID</param>
        public void Completar(Puesto puesto)
        {
            //Completa el Puesto
            persistencia.Completar(puesto);

            //Completa las tareas del Puesto
            GestorTarea gestorTarea = new GestorTarea();

            foreach (Tarea tarea in puesto.Tareas)
            {
                gestorTarea.Completar(tarea);
            }
        }

        /// <summary>
        /// Recupera un listado de todos los puestos registrados
        /// </summary>
        /// <returns>Listado con todos los puestos</returns>
        public List<Puesto> ObtenerListadoCompleto()
        {
            return persistencia.BuscarTodos();
        }

        public List<Puesto> Buscar(long id, string nombre)
        {
            throw new Exception("Metodo no implementado");
        }

        public List<Puesto> Buscar(long? puesto_id, long? proceso_id, string nombre, string descripcion,
                                   bool activo)
        {
            return persistencia.Buscar(puesto_id, proceso_id, nombre, descripcion, activo);
        }
    }
}
